<?php

class UsuarioController extends Zend_Controller_Action
{
    public function init()
    {
        if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    //--------------------------------//
    //             PAGINA             //
    //--------------------------------//

    public function crearAction()
    {
        if (X\CheckAccess::PageAction('Usuario.crear')) return;

        try{
            // obtener los datos
            $departamentos = $this->em->createQueryBuilder()
                    ->select         ('d.codigoDepartamento')
                    ->addselect      ('d.nombreDepartamento')
                    ->from           ('Default_Model_Departamento', 'd')
                    ->orderBy        ('d.nombreDepartamento', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            $perfiles = $this->em->createQueryBuilder()
                    ->select         ('p.codigoPerfil')
                    ->addselect      ('p.nombrePerfil')
                    ->from           ('Default_Model_PerfilPrivilegios', 'p')
                    ->orderBy        ('p.nombrePerfil', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            // convertir a json
            $this->view->jsonDepartamentos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($departamentos),
                "rows"    => $departamentos
            ));
             $this->view->jsonPerfiles = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($perfiles),
                "rows"    => $perfiles
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los datos.';
        }
    }

    public function editarAction()
    {
        if (X\CheckAccess::PageAction('Usuario.editar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getQuery('id');

            // obtener los datos
            $this->view->usuario = $this->em->find('Default_Model_Usuario', $id);

            $departamentos = $this->em->createQueryBuilder()
                    ->select         ('d.codigoDepartamento')
                    ->addselect      ('d.nombreDepartamento')
                    ->from           ('Default_Model_Departamento', 'd')
                    ->orderBy        ('d.nombreDepartamento', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            $perfiles = $this->em->createQueryBuilder()
                    ->select         ('p.codigoPerfil')
                    ->addselect      ('p.nombrePerfil')
                    ->from           ('Default_Model_PerfilPrivilegios', 'p')
                    ->orderBy        ('p.nombrePerfil', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            // convertir a json
            $this->view->jsonDepartamentos = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($departamentos),
                "rows"    => $departamentos
            ));
             $this->view->jsonPerfiles = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($perfiles),
                "rows"    => $perfiles
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar el departamento.';
        }
    }

    public function listarAction()
    {
        if (X\CheckAccess::PageAction('Usuario.listar')) return;

        try{
            // obtener los datos
            $usuarios = $this->em->createQueryBuilder()
                    ->select         ('u.codigoUsuario')
                    ->addselect      ('u.username')
                    ->addselect      ('p.nombrePerfil')
                    ->addselect      ('d.nombreDepartamento')
                    ->addselect      ('u.nombreUsuario')
                    ->addselect      ('u.titulo')
                    ->addselect      ('u.cargo')
                    ->addselect      ('u.apellido')
                    ->addselect      ('u.cedulaNro')
                    ->addselect      ('u.telefono')
                    ->addselect      ('u.email')
                    ->from           ('Default_Model_Usuario', 'u')
                    ->join           ('u.perfil',              'p')
                    ->join           ('u.departamento',        'd')
                    ->orderBy        ('u.username', 'asc')
                    ->setFirstResult (0)
                    ->setMaxResults  (20)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(u.codigoUsuario)')
                    ->from     ('Default_Model_Usuario', 'u')
                    ->join     ('u.perfil',              'p')
                    ->join     ('u.departamento',        'd')
                    ->getQuery ()
                    ->getSingleScalarResult();

            // convertir a json
            $this->view->jsondata = Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $usuarios
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los usuarios.';
        }
    }

    //--------------------------------//
    //              AJAX              //
    //--------------------------------//

    public function ajaxCrearAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Usuario.crear')) return;

        try{
            // obtener los parametros
            $username           = $this->_request->getPost('username');
            $password           = $this->_request->getPost('password');
            $codigoPerfil       = $this->_request->getPost('codigoPerfil');
            $nombreUsuario      = $this->_request->getPost('nombreUsuario');
            $apellido           = $this->_request->getPost('apellido');
            $titulo             = $this->_request->getPost('titulo');
            $cargo              = $this->_request->getPost('cargo');
            $email              = $this->_request->getPost('email');
            $cedulaNro          = $this->_request->getPost('cedulaNro');
            $fechaNacimiento    = $this->_request->getPost('fechaNacimiento');
            $telefono           = $this->_request->getPost('telefono');
            $domicilio          = $this->_request->getPost('domicilio');
            $codigoDepartamento = $this->_request->getPost('codigoDepartamento');

            // verificar
            $cantidad = $this->em->createQueryBuilder()
                ->select   ('count(u.codigoUsuario)')
                ->from     ('Default_Model_Usuario', 'u')
                ->where    ("u.username='".pg_escape_string($username)."'")
                ->getQuery ()
                ->getSingleScalarResult();

            if ($cantidad > 0){
                X\Msg::Failure('Ya existe un usuario con este username.');
                return;
            }

            // crear
            $usuario = new Default_Model_Usuario;

            $usuario->setUsername       ($username);
            $usuario->setPassword       (crypt($password,'$6$rounds=5000$t0c4nt4d3nad3ptr25ajg4973$'));
            $usuario->setNombre         ($nombreUsuario);
            $usuario->setApellido       ($apellido);
            $usuario->setTitulo         ($titulo);
            $usuario->setCargo          ($cargo);
            $usuario->setEmail          ($email);
            if ($cedulaNro)$usuario->setCedulaNro      ($cedulaNro);
            else $usuario->setCedulaNro      (null);
            $usuario->setFechaNacimiento($fechaNacimiento);
            $usuario->setTelefono       ($telefono);
            $usuario->setDomicilio      ($domicilio);

            $usuario->setDepartamento(
                $this->em->find('Default_Model_Departamento', $codigoDepartamento)
            );
            $usuario->setPerfil(
                $this->em->find('Default_Model_PerfilPrivilegios', $codigoPerfil)
            );

            // guardar
            $this->em->persist($usuario);
            $this->em->flush();

            X\Msg::Success('El usuario se ha creado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al crear el usuario.'.$e->getMessage());
        }
    }

    public function ajaxEditarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Usuario.editar')) return;

        try{
            // obtener los parametros
            $codigoUsuario      = $this->_request->getPost('codigoUsuario');
            $username           = $this->_request->getPost('username');
            $password           = $this->_request->getPost('password');
            $codigoPerfil       = $this->_request->getPost('codigoPerfil');
            $nombreUsuario      = $this->_request->getPost('nombreUsuario');
            $apellido           = $this->_request->getPost('apellido');
            $titulo             = $this->_request->getPost('titulo');
            $cargo              = $this->_request->getPost('cargo');
            $email              = $this->_request->getPost('email');
            $cedulaNro          = $this->_request->getPost('cedulaNro');
            $fechaNacimiento    = $this->_request->getPost('fechaNacimiento');
            $telefono           = $this->_request->getPost('telefono');
            $domicilio          = $this->_request->getPost('domicilio');
            $codigoDepartamento = $this->_request->getPost('codigoDepartamento');
         
            // verificar
            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(u.codigoUsuario)')
                    ->from     ('Default_Model_Usuario', 'u')
                    ->where    ("u.username='".pg_escape_string($username)."'")
                    ->andWhere ("u.codigoUsuario<>'$codigoUsuario'")
                    ->getQuery ()
                    ->getSingleScalarResult();

            if ($cantidad > 0){
                X\Msg::Failure('Ya existe un usuario con este username.');
                return;
            }

            // obtener y modificar el objeto
            $usuario = $this->em->find('Default_Model_Usuario', $codigoUsuario);
             
            // si eligió modificar password
            if ($password) $usuario->setPassword(crypt($password,'$6$rounds=5000$t0c4nt4d3nad3ptr25ajg4973$'));
           
            $usuario->setUsername       ($username);
            $usuario->setNombre         ($nombreUsuario);
            $usuario->setApellido       ($apellido);
            $usuario->setTitulo         ($titulo);
            $usuario->setCargo          ($cargo);
            $usuario->setEmail          ($email);
            if ($cedulaNro)$usuario->setCedulaNro      ($cedulaNro);
            else $usuario->setCedulaNro      (null);                 
            $usuario->setFechaNacimiento($fechaNacimiento);
            $usuario->setTelefono       ($telefono);
            $usuario->setDomicilio      ($domicilio);
           
            $usuario->setDepartamento(
                $this->em->find('Default_Model_Departamento', $codigoDepartamento)
            );
            $usuario->setPerfil(
                $this->em->find('Default_Model_PerfilPrivilegios', $codigoPerfil)
            );
           
            // guardar el objeto
            $this->em->persist($usuario);
            $this->em->flush();

            X\Msg::Success('El usuario se ha guardado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al guardar el usuario.'.$e->getMessage());
        }
    }
    
    public function ajaxEliminarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Usuario.eliminar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getPost('id');

            // obtener el objeto
            $usuario = $this->em->find('Default_Model_Usuario', $id);

            // guardar el objeto
            $this->em->remove($usuario);
            $this->em->flush();

            X\Msg::Success('El usuario se ha eliminado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al eliminar el usuario.');
        }
    }

    public function ajaxListarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Usuario.listar')) return;
        
        try{
            // obtener los parametros
            $start = $this->_request->getPost("start");
            $limit = $this->_request->getPost("limit");
            $sort  = $this->_request->getPost("sort");
            $dir   = $this->_request->getPost("dir");

            // parametros por defecto
            $sort = isset($sort)? $sort : 'username';
            $dir  = isset($dir)?  $dir  : 'asc';

            // prefijo para el sort
            $prefijo = ($sort == 'nombrePerfil'?       'p.' :
                       ($sort == 'nombreDepartamento'? 'd.' : 'u.'));


            // obtener los datos        
            $usuarios = $this->em->createQueryBuilder()
                    ->select         ('u.codigoUsuario')
                    ->addselect      ('u.username')
                    ->addselect      ('p.nombrePerfil')
                    ->addselect      ('d.nombreDepartamento')
                    ->addselect      ('u.nombreUsuario')
                    ->addselect      ('u.apellido')
                    ->addselect      ('u.titulo')
                    ->addselect      ('u.cargo')
                    ->addselect      ('u.cedulaNro')
                    ->addselect      ('u.telefono')
                    ->addselect      ('u.email')
                    ->from           ('Default_Model_Usuario', 'u')
                    ->join           ('u.perfil',              'p')
                    ->join           ('u.departamento',        'd')
                    ->orderBy        ($prefijo.$sort, $dir)
                    ->setFirstResult ($start)
                    ->setMaxResults  ($limit)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(u.codigoUsuario)')
                    ->join     ('u.perfil',              'p')
                    ->join     ('u.departamento',        'd')
                    ->from     ('Default_Model_Usuario', 'u')
                    ->getQuery ()
                    ->getSingleScalarResult();

            // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $usuarios
            ));
        }
        catch(Exception $e){
            X\Msg::Failure('Error al listar los usuarios.');
        }
    }
}
